// main
const fs = require('fs')
const path = require('path')

// utils
const ora = require('ora')
const chalk = require('chalk')

/**
 * create 命令，接收一个config文件夹下配置项的文件名。根据配置创建一个项目
 */
const { program } = require('commander')
const inquirer = require('inquirer')
program.name('create util').description('create a project by config file').version('0.0.1')
program
	.command('create')
	.description('pass config file to create a project')
	.argument('<string>', 'config file name')
	.action((name, options) => {
		createPrj(name, options)
		// inquirer
		// 	.prompt([
		// 		{
		// 			type: 'checkbox',
		// 			name: '新项目',
		// 			message: '该项目需要那些文件，请勾选',
		// 			choices: ['xf', 'hh', 'lj', 'cnm', 'zhd', 'shy']
		// 		}
		// 	])
		// 	.then((answers) => {
		// 		console.log('answer: ', answers)
		// 	})
		// 	.catch((err) => {
		// 		console.log(chalk.bgRed(err))
		// 	})
	})
program.parse()

/**
 * 根据配置文件名创建新项目
 * @param {string} name 配置文件名
 * @param {object} options create命令选项
 */
function createPrj(confName, options = {}) {
	const spinner = ora(chalk.cyan('开始创建项目'))
	spinner.start()

	const conf = require(path.resolve(__dirname, 'config', confName)) // 新项目配置
	const distRoot = path.resolve(__dirname, 'project', path.basename(confName, '.json')) // 新项目根目录
	const srcRoot = path.resolve(__dirname, 'src') // 资源根目录

	if (fs.existsSync(distRoot)) fs.rmdirSync(distRoot, { recursive: true }) // 判断项目根目录是否已存在
	fs.mkdirSync(distRoot, { recursive: true })

	// 读取新项目配置，拷贝目标文件
	conf.file.forEach((filePath) => {
		const srcDir = path.resolve(srcRoot, filePath)
		const desDir = path.resolve(distRoot, filePath)
		fs.readdir(srcDir, { withFileTypes: true }, (err, files) => {
			if (!files) {
				// 非目录，即直接拷贝文件
				fs.copyFileSync(srcDir, desDir)
				console.log('\n文件拷贝完成: ', filePath)
			} else {
				//判断是否存在_desDir文件夹
				if (!fs.existsSync(desDir)) {
					fs.mkdir(desDir, (err) => {
						handlerError(err)
					})
				}
				copyDir(srcDir, desDir)
			}
		})
	})

	spinner.stop()
}

/**
 * 拷贝文件夹
 * @param {path} srcDir 入口路径
 * @param {path} desDir 出口路径
 */
function copyDir(srcDir, desDir) {
	fs.readdir(srcDir, { withFileTypes: true }, (err, files) => {
		handlerError(err)
		files.forEach((file) => {
			const dirS = path.resolve(srcDir, file.name)
			const dirD = path.resolve(desDir, file.name)
			//判断是否为文件夹
			if (file.isDirectory()) {
				//判断是否存在dirD文件夹
				if (!fs.existsSync(dirD)) {
					fs.mkdir(dirD, (err) => {
						handlerError(err)
					})
				}
				copyDir(dirS, dirD)
			} else {
				fs.copyFileSync(dirS, dirD)
				console.log('\n文件拷贝完成: ', file.name)
			}
		})
	})
}

/**
 * 错误信息处理工具
 * @param {error} err 错误信息
 */
function handlerError(err) {
	if (err) {
		console.log(`文件操作出错: \n${err}`)
		process.exit(0)
	}
}
